/*
 * Copyright 2015 CPE Lyon - IRC 2013/2016 - Cours de programmation réseau - Groupe H
 *
 * This file is part of BOTT.
 *
 * BOTT is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * BOTT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with BOTT. If not, see http://www.gnu.org/licenses/.
 */

/*
 * Fonctions dédiées au serveur de messagerie.
 */

#ifndef FONCTIONS_SERVEUR_H
#define FONCTIONS_SERVEUR_H

/* Initialisation du serveur */
void init(client *listClients, chat *listChats);

/* Fonction d'arrêt du serveur */
void stopServer();

/* Obtenir le nombre maximum de clients autorisés */
int getMaxClientsNumber();

/* Obtenir le nombre maximum de salons autorisés */
int getMaxChatsNumber();

/* Savoir si le mode de débug est activé */
int isDebugActivated();

/* Obtenir le prochain ID client */
int getNextClientId(client *listClient);

/* Obtenir le prochain ID de salon */
int getNextChatId(chat *listChats);

/* Obtenir le prochain index de salon */
int getNextChatIndex(chat *listChats);

/* Créer une structure pour l'envoi via le socket */
struct sockaddr_in getSendStruct(struct in_addr ip, int16_t port);

/* Récupérer l'IP d'un client */
struct in_addr getUserIp(client *listClients, int idUser);

/* Récupérer le port associé à un client */
int16_t getUserPort(client *listClients, int idUser);

/* Obtenir le prochain index de client */
int getNextClientIndex(client *listClients);

/* Obtenir l'index d'un salon dans la liste */
int getChatIndex(chat *listChats, char *chatName);

/* Obtenir l'index d'un salon dans la liste depuis son ID */
int getChatIndexFromId(chat *listChats, int idChat);

/* Obtenir l'index d'un utilisateur dans la liste depuis son ID */
int getUserIndexFromId(client *listClients, int idUser);

/* Savoir si un client est connecté */
int isClientConnected(client *listClients, int idUser);

/* Savoir si un client est dans un salon */
int isClientInChat(chat *listChats, int idUser, int idChat);

/* Ajouter un client dans la liste des clients d'un salon */
int addClientInChat(int idClient, int idChat, chat *allChats);

/* Ajouter un salon dans la liste des salons d'un client */
int addChatInClient(int idClient, int idChat, client *allClients);

/* Supprimer un client dans la liste des clients d'un salon */
void deleteClientInChat(int idClient, int idChat, chat *allChats);

/* Supprimer un salon dans la liste des salons d'un client */
void deleteChatInClient(int idClient, int idChat, client *allClients);

/* Fonction de débug */
void debug_displayListClients(client *listClients);

/* Fonction de débug */
void debug_displayListChats(chat *listChats);

#endif